#include "../include/Sphere.h"
#include <math.h>
#include <iostream>
#include <stdio.h>
#include "../include/HitPoint.h"

Sphere::Sphere()
{
    //ctor
}

/**
* Constructeur d'une sphère
* @param position centre de la sphère
* @param rayon rayon de la sphère
* @return une sphere
*/
Sphere::Sphere(pVect position, float rayon) {
    this->position = position;
    this->rayon = rayon;
}

/**
* Constructeur d'une sphère
* @param position centre de la sphère
* @param rayon rayon de la sphère
* @param materiaux le materiaux affecté à la sphère
* @return une sphere
*/
Sphere::Sphere(pVect position, float rayon, Materiaux materiaux) {
    this->position = position;
    this->rayon = rayon;
    this->materiaux = materiaux;
}

Sphere::~Sphere()
{
    //dtor
}

/**
* Methode permettant de connaitre le point d'impact entre un rayon et une sphère
* @param origin origine du rayon
* @param rayon vecteur directeur du rayon lancé
* @return un point d'impact
*/
HitPoint* Sphere::intersect(pVect origin, pVect vray) {

    float beta = (origin*vray - this->position*vray)*2;
    float gama = -(this->rayon*this->rayon) + origin.sqrNorm() -(origin*this->position)*2 +this->position.sqrNorm();
    float delta = beta*beta - 4*gama;

    float t =0;
    if(delta < 0){
        return 0;

    }else if(delta == 0){
        t = -beta/2;

    }else{
        t = (-beta-sqrt(delta))/2;
        float x = (-beta+sqrt(delta))/2;
        if(x<t){
            t=x;
        }
    }

    // N'affiche rien si on est dans la sphere
    if(t<0) return 0;

    pVect pos = origin + vray*t;
    pVect normale = pos - this->position;
    normale.normalize();

    return new HitPoint(this, pos, normale, t, vray,origin);
}
